import os
import glob

def convert_seg_to_bbox(seg_label_dir, output_label_dir):
    """
    将YOLO Segmentation格式的归一化标注转换为目标检测格式（Bounding Box），并存储到指定目录。
    目标检测格式的标签保持不变。

    :param seg_label_dir: 分割标注文件所在目录（B路径）
    :param output_label_dir: 目标检测标注文件存储目录（C路径）
    """
    # 确保输出目录存在
    os.makedirs(output_label_dir, exist_ok=True)

    # 读取所有分割标注文件
    label_files = glob.glob(os.path.join(seg_label_dir, "*.txt"))

    for label_file in label_files:
        with open(label_file, "r") as f:
            lines = f.readlines()

        new_lines = []  # 存储转换后的标注信息

        for line in lines:
            parts = line.strip().split()
            class_id = parts[0]  # 类别ID

            if len(parts) == 5:
                # **目标检测格式 (x_center, y_center, width, height)**
                new_lines.append(line.strip() + "\n")  # 直接保留
            elif len(parts) > 5:
                # **分割格式 (x1, y1, x2, y2, ..., xn, yn)**
                points = list(map(float, parts[1:]))  # 解析所有点的坐标

                x_coords = points[0::2]  # 获取所有x坐标
                y_coords = points[1::2]  # 获取所有y坐标

                # 计算边界框 (xmin, ymin, xmax, ymax)
                x_min, x_max = min(x_coords), max(x_coords)
                y_min, y_max = min(y_coords), max(y_coords)

                # 计算 (x_center, y_center, width, height)
                x_center = (x_min + x_max) / 2
                y_center = (y_min + y_max) / 2
                width = x_max - x_min
                height = y_max - y_min

                new_line = f"{class_id} {x_center:.6f} {y_center:.6f} {width:.6f} {height:.6f}\n"
                new_lines.append(new_line)

        # 获取新路径（C目录）
        output_file = os.path.join(output_label_dir, os.path.basename(label_file))

        # 保存转换后的标注文件
        with open(output_file, "w") as f:
            f.writelines(new_lines)

        print(f"转换完成: {output_file}")

# 示例调用
seg_label_path = r"E:\2025-03-20_17_10_52\a\train\labels"  # 替换为分割标注文件目录
output_label_path = r"E:\2025-03-20_17_10_52\a\train\labels_b"  # 替换为目标检测标注存储目录

convert_seg_to_bbox(seg_label_path, output_label_path)
